home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************
- * *
- * Image manipulation module *
- * *
- * Copyright (c) Clever Bits and Bitgate Software 1993 - 1994 *
- * All Rights Reserved. *
- * *
- * This modules deals with all image transforming and scaling etc. *
- * *
- ********************************************************************
- * *
- * Update log: *
- * *
- * [10.5.93 - 10.7.93] Karl A. 0ygard *
- * not documented *
- * [2.11.93] Karl A. 0ygard *
- * - changed some code layout *
- * *
- ********************************************************************/
-
- #include <vdi.h>
-
- #include "winlib.h"
-
- #ifndef __IMAGES__
- #define __IMAGES__
- #endif
-
- /*
- * Scale coordinates
- */
- LOCAL void scale_coords(int *w, int *h)
- {
- *w = (((*w) * image_w) + 7) >> 4;
- *h = (((*h) * image_h) + 7) >> 4;
- }
-
- /*
- * Scale image
- *
- * *src = pointer to image to scale
- * w, h = width and heigth of image
- * mode = scaling mode
- * *b_w, *b_h = pointers to integers to contain new width and height
- *
- * Returns: nothing
- */
- GLOBAL void scale_img(int *src, int w, int h, int mode, int *b_w, int *b_h)
- {
- if (src && big_img != TRUE) {
- int pxy[8], dark = mode & DARK_SCALING, vr_mode = dark ? S_OR_D : S_ONLY;
- MFDB image;
- int n_w = w, n_h = h;
-
- scale_coords(&n_w, &n_h);
- *b_w = n_w;
- *b_h = n_h;
-
- init_mfdb(&image, src, w, h, 0, 1);
-
- if (n_h < h) {
- int y, n_y, l_y, flag = TRUE;
-
- pxy[0] = pxy[4] = l_y = n_y = y = 0;
- pxy[2] = pxy[6] = w - 1;
-
- for (; y < h; y++) {
- if (n_y >= h || dark || y == (h - 1)) {
- pxy[1] = pxy[3] = y;
- pxy[5] = pxy[7] = l_y;
- vro_cpyfm(VDIhandle, flag ? 3 : vr_mode, pxy, &image, &image);
- if (n_y >= h) {
- n_y -= h;
- l_y++;
- flag = TRUE;
- }
- else
- flag = FALSE;
- }
- n_y += n_h;
- }
-
- for (y = n_h - 1; y < h; y++) {
- pxy[1] = pxy[3] = pxy[5] = pxy[7] = y;
- vro_cpyfm(VDIhandle, 0, pxy, &image, &image);
- }
- h = n_h;
- }
-
- if (n_w < w) {
- int x, n_x, l_x, flag = TRUE;
-
- pxy[1] = pxy[5] = l_x = n_x = x = 0;
- pxy[3] = pxy[7] = h - 1;
-
- for (; x < w; x++) {
- if (n_x >= w || dark || x == (w - 1)) {
- pxy[0] = pxy[2] = x;
- pxy[4] = pxy[6] = l_x;
- vro_cpyfm(VDIhandle, (flag) ? 3 : vr_mode, pxy, &image, &image);
-
- if (n_x >= w) {
- n_x -= w;
- l_x++;
- flag = TRUE;
- } else
- flag = FALSE;
- }
- n_x += n_w;
- }
-
- for (x = n_w - 1; x < w; x++) {
- pxy[0] = pxy[2] = pxy[4] = pxy[6] = x;
- vro_cpyfm(VDIhandle, 0, pxy, &image, &image);
- }
- }
- }
- }
-
-
- /*
- * Scale image/bitmap object
- *
- * *obj = pointer to object to transform
- * mode = scaling mode (NO_SCALING/SCALING, TEST_SCALING/DARK_SCALING)
- *
- * Returns: nothing
- */
- GLOBAL void scale_image(OBJECT *obj, int mode)
- {
- if (mode & SCALING) {
- int dummy;
-
- if (big_img) {
- obj->ob_x += ((gr_cw - (image_w >> 1)) * (obj->ob_width / gr_cw)) >> 1;
- obj->ob_y += ((gr_ch - image_h) * (obj->ob_height / gr_ch)) >> 1;
- } else
- if (obj->ob_type == G_ICON) {
- ICONBLK *icn = obj->ob_spec.iconblk;
-
- if (icn->ib_hicon > 3) {
- scale_img(icn->ib_pdata, icn->ib_wicon, icn->ib_hicon, mode, &dummy, &dummy);
- scale_img(icn->ib_pmask, icn->ib_wicon, icn->ib_hicon, mode, &dummy, &icn->ib_hicon);
- scale_coords(&icn->ib_xicon, &icn->ib_yicon);
- scale_coords(&icn->ib_xtext, &icn->ib_ytext);
- scale_coords(&icn->ib_xchar, &icn->ib_ychar);
- }
- } else {
- BITBLK *blk = obj->ob_spec.bitblk;
-
- if (blk->bi_hl > 3) {
- scale_img(blk->bi_pdata, blk->bi_wb << 3, blk->bi_hl, mode, &dummy, &blk->bi_hl);
- scale_coords(&blk->bi_x, &blk->bi_y);
- }
- }
- }
- }
-
-
- /*
- * Transforms standard raster into device dependent raster
- *
- * w = width of raster
- * h = height of raster
- * *data = pointer to raster data
- */
- GLOBAL void vdi_trans(int w, int h, void *data)
- {
- if (data) {
- MFDB src, dst;
-
- init_mfdb(&src, (int *) data, w, h, 1, 1);
- init_mfdb(&dst, (int *) data, w, h, 0, 1);
-
- vr_trnfm(VDIhandle, &src, &dst);
- }
- }
-
-
- /*
- * Transform icon or bitmap into device dependent raster
- *
- * *obj = pointer to object
- */
- GLOBAL void trans_image(OBJECT *obj)
- {
- if (obj->ob_type == G_ICON) {
- ICONBLK *icn = obj->ob_spec.iconblk;
-
- vdi_trans(icn->ib_wicon, icn->ib_hicon, icn->ib_pmask);
- vdi_trans(icn->ib_wicon, icn->ib_hicon, icn->ib_pdata);
- } else {
- BITBLK *img = obj->ob_spec.bitblk;
-
- vdi_trans(img->bi_wb << 3, img->bi_hl, img->bi_pdata);
- }
- }
-
-
- /*
- * Initialize mfdb block
- *
- * *fm = mfdb to initialize
- * w = width of mfdb
- * h = height of mfdb
- * st = 0/1 - standardformat/dependent
- * pl = bitplanes
- */
- GLOBAL void init_mfdb(MFDB *fm, int *adr, int w, int h, int st, int pl)
- {
- fm->fd_addr = adr;
- fm->fd_w = (w + 15) & 0xfff0;
- fm->fd_h = h;
- fm->fd_wdwidth = fm->fd_w >> 4;
- fm->fd_stand = st;
- fm->fd_nplanes = pl;
- }
-